<?php
/**
 * 用户写入数据过滤、验证、转换等
 * 抽象类，不能直接实例化使用，需要在具体的数据项应用中继承此项使用
 * 
 * @package SFramework
 * @subpackage App
 * @author Shuky
 * @since v1.0
 * @version $Id: Input.php 82 2010-12-23 18:23:35Z shukyoo@gmail.com $
 */
namespace SF;


abstract class Input
{
	const POST_RAND_NAME = 'rand';
	const POST_KEY_NAME = 'fhash';
	const POST_KEY_VALUE = 'shukynet_mouxa_123';

    // 传入的数据
    protected $_input;
    
    // 处理后的数据
    protected $_data;
    
    // 是否有效
    protected $_valid = true;
    
    // 验证消息
    protected $_message;
    
    /**
     * 过虑器
     * @var \SFramework\Filter
     */
    protected $_filter = null;
    
    /**
     * 验证器
     * @var \SFramework\Validator
     */
    protected $_validator = null;
    
    
	public function __construct($input)
	{
	    // 传入数据
		$this->_input = $input;
		
		// 数据初始化构造
		$this->init();
	}
	
	
	/**
	 * 数据配置项初始化
	 */
	abstract public function init();
	
	
	/**
	 * 添加数据项
	 * @param string $name 传入数据Key名
	 * @param array $options 操作方式配置
	 */
	public function addItem($name, $options)
	{
	    // 与数据库或其它存储器字段的映射
	    $reflection = empty($options['reflection']) ? $name : $options['reflection'];
	    // 数据值
	    $value = array_key_exists($name, $this->_input) ? 
	                                            $this->_input[$name] : 
	                                            (isset($options['default']) ? $options['default'] : null);
	                                            
	    // 过虑
	    if (!empty($options['filters'])) {
	        if (null === $this->_filter) {
	        	$this->_filter = new Filter();
	        }
	        $this->_filter->setValue($value);
	        $value = $this->_filter->runFilter($options['filters']);
	    }
	    
	    // 验证
	    if (!empty($options['validators'])) {
	    	if (null === $this->_validator) {
	    		$this->_validator = new Validator();
	    	}
	    	$this->_validator->setValue($value);
	    	$this->_valid = $this->_validator->runValidator($options['validators']);
	    	$this->_message = $this->_validator->getMessage();
	    }
	    
	    // 转换后的数据
	    $this->_data[$reflection] = $value;
	}


	/**
	 * 表单hash验证
	 * 还会验证表单的时间有效性
	 * 还没有找到一个比较好的表现方法，所以暂时不用表单hash
	public function hashValid()
	{
		$request = Request::getInstance();
		$rand = $request->getPost(self::POST_KEY_RAND, 0);
		$fhash = $request->getPost(self::POST_KEY_NAME, '');
		if ($rand && $fhash) {
			return md5(substr(time(), 0, -4) . $rand . self::POST_KEY_VALUE) == $fhash;
		} else {
			return false;
		}
	}
	 */	
	
	/**
	 * 是否有效
	 */
	public function isValid()
	{
		$request = Request::getInstance();
		if (strpos($request->getReferer(), $request->getHostInfo()) !== 0) {
			$this->_message = 'Invalid Request';
			$this->_valid = false;
		}
		return $this->_valid;
	}
	
	
	/**
	 * 获取消息
	 */
	public function getMessage()
	{
		return $this->_message;
	}
	
	
	/**
	 * 获取处理后的数据
	 */
	public function getData($key = null)
	{
	    if ($key == null) {
	    	return $this->_data;
	    } else {
	    	if (!key_exists($key, $this->_data)) {
			    throw new SException\InvalidArgument($key .':指定的参数无效');
		    }
		    return $this->_data[$key];
	    }
	}


	public function __set($key, $value)
	{
		$this->_data[$key] = $value;
	}


	public function __get($key)
	{
		return isset($this->_data[$key]) ? $this->_data[$key] : '';
	}
}